package demo.day11_CollectionAddpackage;

/**
 * @Auther: hjy(lc))
 * @Date: 2022/8/1-08-01-14:04
 * @Description：demo.day11_CollectionAddpackage
 */
public class String_use {
    public static void main(String[] args) {
        String str1 = new String("23");     //存储在堆中（通过new出来的都存储在堆中，==判断时都不会相等）
        /*new String() 总共创建了2个对象
            在字符串常量池和堆中各创建了1个对象*/
        String str2 = "23";                      //存储在字符串常量池（jdk8后字符串常量池放在堆中）中
        System.out.println(str1 == str2);    //false
        //str1 = str1.intern();     //将str1返回字符串常量池中的地址
        str1.intern();      //str1指向堆中地址（常量池中已经存在str1）
        System.out.println(str1 == str2);      //true

        System.out.println("--------------------------------");
        String e = "2" + "3";             //堆中字符串常量池
        System.out.println(str2 == e);        //true
        System.out.println("23" == str2);    //true

        String ee = str2 + e;
        String e2 = "2323";
        System.out.println(ee == e2);             //false

        System.out.println("---------------------------------------");

        final String a = "a";   //常量
        final String b = "b";    //常量
        String ab = "ab";
        String c = a + b;
        System.out.println(ab == c);       //true
        System.out.println("----------------------------------");

        String a1 = "c";
        String b1 = "d";
        String c1 = a1 + b1;
        String d1 = "cd";
        c1.intern();              //如果常量池中已有，c1不会将值放进去 但会返回常量池中的地址，如果不存在，放入常量池，重新指向常量池地址，并返回字符串常量池中地址
        System.out.println(c1 == d1);     //false

        /*
        字符串不可变：
            private final char value[];  修饰符原因
            自身类没有提供操作value[]的公有方法
            此类由final修饰，没有子类继承，也无通过子类去操作此value[]
         */
    }
}
